/**
 * This file is part of 1genia trampoline
 * Copyright (C) 2007 1genia (contact@1genia.com)
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; version 3 of the License. 
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details. 
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; see the file COPYING.TXT.  If not,
 * write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA 02110-1301, USA. 
 **/
package com.genia.toolbox.uml_generator.transformer;

import java.util.Map;

import org.w3c.dom.Element;

import com.genia.toolbox.basics.manager.XmlManager;
import com.genia.toolbox.uml_generator.bean.ModelGeneratorContext;

/**
 * this class handle the input of the model from xmi file.
 * 
 * @param <ObjectType>
 *          the type of the parent of the current {@link Element}
 */
public class InputHandlerDispatcher<ObjectType>
    implements InputHandler<ObjectType>
{

  /**
   * the {@link InputHandler} to use depending on the name of the element.
   */
  private Map<String, InputHandler<ObjectType>> handlerByTagName;

  /**
   * the {@link XmlManager} to use.
   */
  private XmlManager xmlManager;



  /**
   * the actual method that parse the current {@link Element}.
   * @param context
   *          the generation context
   * @param firstPass
   *          wether it is the first or second pass
   * @param element
   *          the element to parse
   * @param parent
   *          the generated parent model
   * 
   * @see com.genia.toolbox.uml_generator.transformer.InputHandler#processContent(com.genia.toolbox.uml_generator.bean.ModelGeneratorContext,
   *      boolean, org.w3c.dom.Element, ObjectType)
   */
  public void processContent(ModelGeneratorContext context, boolean firstPass, Element element, ObjectType parent)
  {
    if (getXmlManager().getAttribute(element, "xmi.idref") != null) {
      return;
    }
    InputHandler<ObjectType> handler = getHandlerByTagName().get(element.getTagName());
    if (handler != null) {
      handler.processContent(context, firstPass, element, parent);
    }
    else {
      for (Element child : getXmlManager().getElements(element.getChildNodes())) {
        processContent(context, firstPass, child, parent);
      }
    }
  }



  /**
   * getter for the handlerByTagName property.
   * 
   * @return the handlerByTagName
   */
  public Map<String, InputHandler<ObjectType>> getHandlerByTagName()
  {
    return handlerByTagName;
  }



  /**
   * setter for the handlerByTagName property.
   * 
   * @param handlerByTagName
   *          the handlerByTagName to set
   */
  public void setHandlerByTagName(Map<String, InputHandler<ObjectType>> handlerByTagName)
  {
    this.handlerByTagName = handlerByTagName;
  }



  /**
   * getter for the xmlManager property.
   * 
   * @return the xmlManager
   */
  public XmlManager getXmlManager()
  {
    return xmlManager;
  }



  /**
   * setter for the xmlManager property.
   * 
   * @param xmlManager
   *          the xmlManager to set
   */
  public void setXmlManager(XmlManager xmlManager)
  {
    this.xmlManager = xmlManager;
  }

}
